'use strict'

process.chdir(__dirname)

const titbit = require('titbit')
const fs = require('fs')

try{
    fs.accessSync('./images')
}catch(err){
    fs.mkdirSync('./images')
}
//node http-and-nodejs/app.js 启动node进程

let cert_path = '/usr/local/share'

const app = new titbit({
    //开启调试模式若有错误会输出错误
    debug:true,
    globalLog: true,
    cert:`${cert_path}/api.jinjin.work.pem`,
    key:`${cert_path}/api.jinjin.work.key`
})

app.get('/',async c => {
    c.send('OK')
})

/**---------------content路由--------------- */
//获取内容列表
//不能添加相同的路由，相同的路由会报错
app.get('/content',async c=>{
    let ret = await psql.query(`select * from content`)
    //等效于c.res.body = ret.rows
    c.send(ret.rows)
    //查询到的结果在rows属性里
    //此处不能end，因为 我们是长久保持的服务器
})

//获取具体内容
app.get('/content/:id',async c=>{
    let sqltext = `SELECT * FROM content WHERE id=$1`

    let r = await psql.query(sqltext,[c.param.id])

    if(r.rowContent === 0){
        return c.status(404).send('content not found')
    }

    c.send(r.rows[0])

})

//创建内容
app.post('/content',async c=>{

})

/** -------------content路由 - END -------------*/

app.get('/upload',async c => {
    // c.reply是响应对象，可写的流，
    // 在HTTP/1.1中c.reply指向response；在HTTP/2中c.reply指向http2stream
    await c.helper.pipe('./httphandleprogram/upload.html',c.reply)//请求模块里有一个helper模块，提供很多工具，比如生成唯一id等等
    
    
})
app.get('/randimg', async c => {//随机返回一张图片
    fs.readdir('./images' ,(e,files) =>{
        if (e) {
            c.send(e)
        }
        else {
            let i = parseInt(Math.random()*files.length);//应返回一个图片的数据
            c.send(files[i]);
        }
    })
})

// app.get('/upload',async c=> {
//     await c.helper.pipe('./upload.html',c.reply)
//     reply是响应对象，可写的流
//     HTTP/1:c.reply -> response
//     HTTP/2:c.reply -> stream
// })

app.post('/upload',async c=> {
    //根据name获取文件对象
    let f = c.getFile('image')

    if(!f){
        return c.status(400).send('image not found')
    }

    //根据传入的原始文件名生成唯一文件名，主要使用f.fileName的扩展名
    let fname = c.helper.makeName(f.filename)

    //指定文件移动位置
    await c.moveFile(f,`./images/${fname}`)

    c.send(fname)
})
// *表示以后还可以有任意个路径
//get
//返回图片数据
app.get('/image/:name',async c => {// /image/a.jpg
    //c.param是一个对象，其中key值是路由参数的名称
    let imgname = c.param.name//param是参数的缩写
    await c.helper.pipe(`./images/${imgname}`,c.reply)
})

app.run(4399);
